// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Author: wsfuyibing <682805@qq.com>
// Date: 2025-02-12

package conf

import (
	"fmt"
	"math/rand"
)

// ErpAgent
// 定义 CRMEB 服务, 每一个服务代表一个实例.
type ErpAgent struct {
	// ClientKey
	// 客户端名称, 指向ERP实例名.
	//
	//   if agent, ok := conf.Config.GetAgent("crmeb_pf"); ok {
	//       if client, has := conf.Config.GetClient(agent.ClientKey); has {
	//           println("client host:", client.Host)
	//           // ...
	//       }
	//   }
	ClientKey string `yaml:"client_key"`

	RoutineKey string `yaml:"routine_key"`

	// ConnectionKey
	// 数据库连接名称, 指向数据库连接配置. 一经配置, 其详细的配置参数必在 config/db.yaml
	// 文件中定义.
	//
	// DB配置
	//   // config/db.yaml
	//   databases:
	//     crmeb_pf:
	//       dsn:
	//         - "username:password@tcp(127.0.0.1:3306)/crmeb_pf?charset=utf8"
	//
	// 参数用法:
	//   if agent, ok := conf.Config.GetAgent("crmeb_pf"); ok {
	//       if sess, err := db.Config.GetSlave(ctx, agent.ConnectionKey); err == nil {
	//           service := services.NewOrderService(sess)
	//           bean, err := service.GetById(ctx, 1)
	//           // ...
	//       }
	//   }
	ConnectionKey string `yaml:"connection_key"`

	// Prefix
	// 业务前缀, 不同的CRMEB务必区分开, 否则会出现数据混乱.
	//
	//   1. 客户编号
	//   2. 单据编号
	Prefix string `yaml:"trade_no_prefix"`

	// +-----------------------------------------------------------------------+
	// | 下列配置，需从ERP进程销存系统中获取                                        |
	// +-----------------------------------------------------------------------+

	// OrganizationId
	// 组织ID.
	//
	// 来自ERP进销存系统(ERP进销存/系统/组织架构)的组织架构.
	OrganizationId int `yaml:"organization_id"`

	// CoinAccountId
	// 资金账户ID.
	//
	// 来自ERP进销存系统(ERP进销存/资料/财务资料/资金账户)的资金账户ID.
	CoinAccountId int `yaml:"coin_account_id"`

	// CustomerType
	// 客户类别.
	//
	// 来自ERP进销存系统(ERP进销存/资料/客户资料/客户类型)的类别ID.
	CustomerType int `yaml:"customer_type"`

	// CreatorId
	// 制单人ID.
	//
	// 来自ERP进销存系统的用户ID.
	CreatorId int `yaml:"creator_id"`

	// ManagerId
	// 人员(管理人)ID.
	//
	// 来自ERP进销存系统(ERP进销存/资料/人员管理)的人员ID. 用于关联ERP中的客户、销售
	// 订单、销售退单等.
	ManagerId int `yaml:"manager_id"`
}

// GenerateCustomerName
// 生成客户名.
//
// 同一个ERP系统下，客户名不能重复，避免同名用户造成ERP数据处理失败.
//
//	return "BKT张三1001" // 表示：`报刊亭客户，名字为张三，编号为1001.
func (o *ErpAgent) GenerateCustomerName(uid int, name string) string {
	return fmt.Sprintf(`%s%s%d`, o.Prefix, name, uid)
}

// GenerateCustomerNo
// 生成客户编号.
//
//	return "BKTKH1001" // 表示：报刊亭客户，其编号为1001.
func (o *ErpAgent) GenerateCustomerNo(uid int) string {
	return fmt.Sprintf(`%sKH%d`, o.Prefix, uid)
}

// GenerateOutTradeNo
// 生成订单编号.
//
//	return "BTKDD37210234" // 表示：报刊亭退单，订单ID为3721，随机值为0234.
func (o *ErpAgent) GenerateOutTradeNo(oid int) string {
	return fmt.Sprintf(`%sDD%d%04d`, o.Prefix, oid, rand.Int31n(9999))
}

// GenerateOutRefundNo
// 生成退单编号.
//
//	return "BTKTD37211890" // 报刊亭退单，订单ID为3721，随机值为1890.
func (o *ErpAgent) GenerateOutRefundNo(oid int) string {
	return fmt.Sprintf(`%sTD%d%04d`, o.Prefix, oid, rand.Int31n(9999))
}
